﻿using System;
using System.Collections.Generic;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Modelo.Objetos;
using Onshi.POS.Repositorios;
using Onshi.POS.Clientes.Vistas;

namespace Onshi.POS.Clientes
{
    public class ClientesAltaModificacionPresentador
    {
        #region Constructores

        public ClientesAltaModificacionPresentador(IClientesAltaModificacion vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        private IClientesAltaModificacion vista;

        #endregion

        #region Propiedades

        private RepositorioTipoRegistro RepositorioTipoRegistro
        {
            get { return new RepositorioTipoRegistro(); }
        }

        private RepositorioRegistro RepositorioRegistro
        {
            get { return new RepositorioRegistro(); }
        }

        private RepositorioBarrio RepositorioBarrio
        {
            get { return new RepositorioBarrio(); }
        }

        private RepositorioTipoDomicilio RepositorioTipoDomicilio
        {
            get { return new RepositorioTipoDomicilio(); }
        }

        private RepositorioTipoTelefono RepositorioTipoTelefono
        {
            get { return new RepositorioTipoTelefono(); }
        }

        private RepositorioRubroCliente RepositorioRubroCliente
        {
            get { return new RepositorioRubroCliente(); }
        }

        private RepositorioTipoIva RepositorioTipoIva
        {
            get { return new RepositorioTipoIva(); }
        }

        private RepositorioVendedor RepositorioVendedor
        {
            get { return new RepositorioVendedor(); }
        }

        private RepositorioCliente RepositorioCliente
        {
            get { return new RepositorioCliente(); }
        }

        private RepositorioListaPrecioVenta RepositorioListaPrecioVenta
        {
            get { return new RepositorioListaPrecioVenta(); }
        }

        private RepositorioTipoMensajeriaInstantanea RepositorioTipoMensajeriaInstantanea
        {
            get { return new RepositorioTipoMensajeriaInstantanea(); }
        }

        private RepositorioTipoFormaPago RepositorioTipoFormaPago
        {
            get { return new RepositorioTipoFormaPago(); }
        }

        #endregion

        #region Metodo

        public void Inicializar()
        {
            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    vista.ListaDomicilios = new List<DomicilioCliente>();
                    vista.ListaTelefonos = new List<TelefonoCliente>();
                    var listaDetalles = new List<ClienteTipoFormaPago>();
                    foreach (var item in RepositorioTipoFormaPago.DevolverTodos())
                    {
                        var detalle = new ClienteTipoFormaPago();
                        detalle.Id = 0;
                        detalle.Cliente = null;
                        detalle.TipoFormaPago = item;
                        detalle.TienePermiso = false;
                        listaDetalles.Add(detalle);
                    }
                    vista.ListaTiposFormasPagos = listaDetalles;
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    var cliente = RepositorioCliente.DevolverPorIdConDetalleDomiciliosTelefonos(vista.IdCliente);
                    if (cliente == null)
                        throw new Exception("El cliente no existe");
                    vista.IdCliente = cliente.Id;
                    vista.IdRubroCliente = cliente.Rubro.Id;
                    vista.IdTipoIva = cliente.TipoIva.Id;
                    vista.IdVendedor = cliente.Vendedor.Id;
                    vista.IdTipoMensajeriaInstantanea = cliente.TipoMensajeriaInstantanea.Id;
                    vista.Codigo = cliente.Codigo;
                    vista.Nombre = cliente.Nombre;
                    vista.Cuit = cliente.Cuit;
                    vista.LimiteDeuda = cliente.LimiteDeuda;
                    vista.DescuentoRecargo = cliente.DescuentoRecargo;
                    vista.Email = cliente.Email;
                    vista.SitioWeb = cliente.SitioWeb;
                    vista.MensajeriaInstantanea = cliente.MensajeriaInstantanea;
                    vista.ListaDomicilios = cliente.Domicilios;
                    vista.ListaTelefonos = cliente.Telefonos;
                    vista.Imagen = cliente.Detalle.Imagen;
                    vista.Observacion = cliente.Detalle.Observacion;
                    break;
            }
        }

        public void Aceptar()
        {
            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    if (!DatosComunes.TienePermiso(EnumPermiso.CLIENTE_ALTA))
                        throw new Exception(DatosComunes.SinPermiso);
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    if (!DatosComunes.TienePermiso(EnumPermiso.CLIENTE_MODIFICACION))
                        throw new Exception(DatosComunes.SinPermiso);
                    break;
            }
            if (vista.EstadoABM == EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION)
            {
                if (vista.IdVendedor == (Int32)EnumCliente.CLIENTE_DEL_MOSTRADOR)
                    throw new Exception("El cliente no se puede modificar");
                if (RepositorioCliente.DevolverPorId(vista.IdCliente) == null)
                    throw new Exception("El cliente no existe");
            }
            var cliente = new Cliente();
            cliente.Rubro = RepositorioRubroCliente.DevolverPorId(vista.IdRubroCliente);
            if (cliente.Rubro == null)
                throw new Exception("El rubro no existe");
            cliente.TipoIva = RepositorioTipoIva.DevolverPorId(vista.IdTipoIva);
            if (cliente.TipoIva == null)
                throw new Exception("El tipo de I.V.A. no existe");
            cliente.TipoMensajeriaInstantanea = RepositorioTipoMensajeriaInstantanea.DevolverPorId(vista.IdTipoMensajeriaInstantanea);
            if (cliente.TipoMensajeriaInstantanea == null)
                throw new Exception("El tipo de mensajeria instantanea no existe");
            cliente.ListaPrecioVenta = RepositorioListaPrecioVenta.DevolverPorId(vista.IdListaPrecioVenta);
            if (cliente.ListaPrecioVenta == null)
                throw new Exception("La lista de precio de venta no existe");
            cliente.Vendedor = RepositorioVendedor.DevolverPorId(vista.IdVendedor);
            if (cliente.Vendedor == null)
                throw new Exception("La lista de precio de venta no existe");
            cliente.Codigo = vista.Codigo;
            if (String.IsNullOrWhiteSpace(cliente.Codigo))
                throw new Exception("El código no puede quedar vacio");
            cliente.Nombre = vista.Nombre;
            if (String.IsNullOrWhiteSpace(cliente.Nombre))
                throw new Exception("El nombre no puede quedar vacio");
            cliente.LimiteDeuda = vista.LimiteDeuda;
            if (cliente.LimiteDeuda < 0)
                throw new Exception("El limite de deuda no puede ser positivo");
            cliente.Cuit = vista.Cuit;
            cliente.Email = vista.Email;
            cliente.SitioWeb = vista.SitioWeb;
            cliente.Detalle = new DetalleCliente();
            cliente.Detalle.Cliente = cliente;
            cliente.Detalle.Observacion = vista.Observacion;
            cliente.Detalle.Imagen = vista.Imagen;
            if ((EnumTipoMensajeriaInstantanea)cliente.TipoMensajeriaInstantanea.Id == EnumTipoMensajeriaInstantanea.NO_UTILIZA)
                cliente.MensajeriaInstantanea = String.Empty;
            else
                cliente.MensajeriaInstantanea = vista.MensajeriaInstantanea;
            var registro = new Registro();
            registro.Usuario = DatosComunes.Usuario;
            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    registro.Tipo = RepositorioTipoRegistro.DevolverPorId((Byte)EnumTipoRegistro.CLIENTE_ALTA);
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    registro.Tipo = RepositorioTipoRegistro.DevolverPorId((Byte)EnumTipoRegistro.CLIENTE_MODIFICACION);
                    break;
            }
            if (registro.Tipo == null)
                throw new Exception("El tipo de registro no existe");
            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    RepositorioCliente.Insertar(cliente);
                    RepositorioCliente.InsertarDetalle(cliente.Detalle);
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    cliente.Id = vista.IdCliente;
                    RepositorioCliente.Modificar(cliente);
                    RepositorioCliente.ModificarDetalle(cliente.Detalle);
                    RepositorioCliente.EliminarDomiciliosPorCliente(cliente);
                    RepositorioCliente.EliminarTelefonosPorCliente(cliente);
                    RepositorioCliente.EliminarClientesTiposFormasPagosPorCliente(cliente);
                    break;
            }
            RepositorioRegistro.Insertar(registro, cliente);
            foreach (var item in vista.ListaTiposFormasPagos)
                if (item.TienePermiso)
                {
                    item.Cliente = cliente;
                    item.TipoFormaPago = RepositorioTipoFormaPago.DevolverPorId(item.TipoFormaPago.Id);
                    if (item.TipoFormaPago != null)
                        RepositorioCliente.InsertarClienteTipoFormaPago(item);
                }
            foreach (var item in vista.ListaDomicilios)
            {
                item.Cliente = cliente;
                item.Barrio = RepositorioBarrio.DevolverPorId(item.Barrio.Id);
                item.Tipo = RepositorioTipoDomicilio.DevolverPorId(item.Tipo.Id);
                if (item.Tipo != null && item.Barrio != null)
                    RepositorioCliente.InsertarDomicilio(item);
            }
            foreach (var item in vista.ListaTelefonos)
            {
                item.Cliente = cliente;
                item.Tipo = RepositorioTipoTelefono.DevolverPorId(item.Tipo.Id);
                if (item.Tipo != null)
                    RepositorioCliente.InsertarTelefono(item);
            }
        }

        #endregion
    }
}
